package com.example.ruoyivoicecall.util;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

/**
 * 编码转换工具类
 * 提供ASCII与Native编码（中文）之间的转换功能
 */
public class EncodingUtil {
    
    /**
     * ASCII编码转Native编码（将Unicode转义序列转换为中文）
     * 
     * @param ascii ASCII编码的字符串
     * @return Native编码的字符串（中文）
     */
    public static String ascii2Native(String ascii) {
        if (ascii == null || ascii.isEmpty()) {
            return ascii;
        }
        
        // 使用StringBuilder提高效率
        StringBuilder nativeStr = new StringBuilder();
        int length = ascii.length();
        int i = 0;
        
        while (i < length) {
            // 查找Unicode转义序列
            int unicodeStart = ascii.indexOf("\\u", i);
            
            if (unicodeStart == -1) {
                // 没有找到Unicode转义序列，添加剩余部分
                nativeStr.append(ascii.substring(i));
                break;
            } else {
                // 添加转义序列前的普通字符
                nativeStr.append(ascii.substring(i, unicodeStart));
                
                // 确保有足够的字符用于Unicode转义序列
                if (unicodeStart + 6 <= length) {
                    String unicodeCode = ascii.substring(unicodeStart + 2, unicodeStart + 6);
                    try {
                        // 将16进制的Unicode码转换为字符
                        char unicodeChar = (char) Integer.parseInt(unicodeCode, 16);
                        nativeStr.append(unicodeChar);
                        i = unicodeStart + 6;
                    } catch (NumberFormatException e) {
                        // 如果不是有效的16进制数字，原样添加
                        nativeStr.append("\\u").append(unicodeCode);
                        i = unicodeStart + 6;
                    }
                } else {
                    // 转义序列不完整，原样添加
                    nativeStr.append(ascii.substring(unicodeStart));
                    break;
                }
            }
        }
        
        return nativeStr.toString();
    }
    
    /**
     * GBK编码的字节数组转UTF-8编码的字符串
     * 用于处理从GBK编码的HTML页面获取的中文数据
     * 
     * @param bytes GBK编码的字节数组
     * @return UTF-8编码的字符串
     */
    public static String gbkToUtf8(byte[] bytes) {
        if (bytes == null) {
            return null;
        }
        try {
            // 先以GBK解码，再以UTF-8编码
            return new String(bytes, "GBK");
        } catch (UnsupportedEncodingException e) {
            // 如果编码不支持，原样返回
            return new String(bytes);
        }
    }
    
    /**
     * 处理可能的乱码文本，确保中文正确显示
     * 
     * @param text 可能有乱码的文本
     * @return 正确编码的文本
     */
    public static String fixEncoding(String text) {
        if (text == null || text.isEmpty()) {
            return text;
        }
        try {
            // 尝试重新编码解码，修复可能的乱码
            return new String(text.getBytes("ISO-8859-1"), "GBK");
        } catch (UnsupportedEncodingException e) {
            // 如果失败，返回原始文本
            return text;
        }
    }
    
    /**
     * Native编码转ASCII编码（将中文字符转换为Unicode转义序列）
     * 
     * @param nativeStr Native编码的字符串（中文）
     * @return ASCII编码的字符串
     */
    public static String native2Ascii(String nativeStr) {
        return nativeStr;
//        if (nativeStr == null || nativeStr.isEmpty()) {
//            return nativeStr;
//        }
//
//        // 先确保文本编码正确
//        String fixedStr = fixEncoding(nativeStr);
//
//        StringBuilder ascii = new StringBuilder();
//        for (int i = 0; i < fixedStr.length(); i++) {
//            char c = fixedStr.charAt(i);
//            // 如果是ASCII字符（0-127），直接添加
//            if (c < 128) {
//                ascii.append(c);
//            } else {
//                // 否则转换为Unicode转义序列
//                String hex = Integer.toHexString(c);
//                // 确保是4位的十六进制数，不足前面补0
//                String unicodeHex = "0000".substring(0, 4 - hex.length()) + hex;
//                ascii.append("\\u").append(unicodeHex);
//            }
//        }
//
//        return ascii.toString();
    }
    
    /**
     * URL编码（UTF-8）
     * 
     * @param str 需要编码的字符串
     * @return URL编码后的字符串
     */
    public static String urlEncode(String str) {
        if (str == null) {
            return null;
        }
        try {
            return URLEncoder.encode(str, StandardCharsets.UTF_8.name());
        } catch (UnsupportedEncodingException e) {
            // UTF-8编码是标准编码，不会抛出异常
            return str;
        }
    }
    
    /**
     * URL解码（UTF-8）
     * 
     * @param str 需要解码的字符串
     * @return URL解码后的字符串
     */
    public static String urlDecode(String str) {
        if (str == null) {
            return null;
        }
        try {
            return URLDecoder.decode(str, StandardCharsets.UTF_8.name());
        } catch (UnsupportedEncodingException e) {
            // UTF-8编码是标准编码，不会抛出异常
            return str;
        }
    }
}